/*	--- 线程的状态 --- 

在Java程序中，一个线程对象只能调用一次start()方法启动新线程，并在新线程中执行run()方法。一旦run()方法执行完毕，线程就结束了。因此，Java线程的状态有以下几种：

	· New： 新创建的线程，尚未执行；
	· Runnable： 运行中的线程，正在执行run()方法的Java代码；
	· Blocked： 运行中的线程，因为某些(I/O)操作被阻塞而挂起；
	· Waiting： 运行中的线程，因为某些操作(等待其他thread同步)而等待中；
	· Timed Waiting： 运行中的线程，因为执行sleep()方法正在计时等待；
	· Terminated： 线程已终止，因为run()方法执行完毕。


用一个状态转移图表示如下：

	         ┌─────────────┐
	         │     New     │
	         └─────────────┘
	                │
	                ▼
	┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
	 ┌─────────────┐ ┌─────────────┐
	││  Runnable   │ │   Blocked   ││
	 └─────────────┘ └─────────────┘
	│┌─────────────┐ ┌─────────────┐│
	 │   Waiting   │ │Timed Waiting│
	│└─────────────┘ └─────────────┘│
	 ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
	                │
	                ▼
	         ┌─────────────┐
	         │ Terminated  │
	         └─────────────┘

----------------------------

当线程启动后(Thread.start(); )，
它(线程)可以在Runnable、 Blocked、 Waiting和Timed Waiting这几个状态之间进行切换，直到最后变成Terminated状态(线程终止)。


线程终止(Terminated状态)的原因有：

	· 线程正常终止：run()方法执行到return语句返回；

	· 线程意外终止：run()方法因为未捕获的异常导致线程终止；

	· 对某个线程的Thread实例调用stop()方法强制终止（强烈不推荐使用）。


一个线程还可以等待另一个线程直到其运行结束。例如，main线程在启动t线程后，可以通过t.join()让‘main线程’等待‘t线程’结束后再继续运行： */
public class Main {
	public static void main(String[] args) throws InterruptedException {
		Thread t = new Thread(() -> {
			System.out.println("hello");
		});

		System.out.println("Start");

		t.start();
		t.join();

		System.out.println("end");
	}
}


/*
当main线程对线程对象t调用join()方法时，主线程将等待变量t表示的线程运行结束，即join就是指等待该线程结束，然后才继续往下执行自身线程。

所以，上述代码打印顺序可以肯定是main线程先打印start，t线程再打印hello，main线程最后才打印end。

如果t线程已经结束，对实例t调用join()会立刻返回。

此外，join(long)的重载方法也可以指定一个等待时间，超过等待时间后就不再继续等待。

--------------------------------*/



/*	---- 线程的状态 の 小结 ---- 

1. Java线程对象Thread的状态包括：New、Runnable、Blocked、Waiting、Timed Waiting和Terminated；
	
	· New： 新创建的线程,尚未执行；
	· Runnable： 运行中的线程,正在执行run()方法的Java代码；
	· Blocked： 运行中的线程,因为某些操作被阻塞而挂起；
	· Waiting： 运行中的线程,因为某些操作而等待中；
	· Timed Waiting： 运行中的线程,因为执行sleep()方法正在计时等待;
	· Terminated： 线程已终止,因为run()方法执行完毕。

2. 通过对另一个线程对象调用join()方法可以等待其执行结束；
	Thread t = new Thread();
	t.start();
	t.join();

3. 可以指定等待时间，超过等待时间线程仍然没有结束就不再等待;
	Thread t = new Thread();
	t.start();
	t.join(1000);

4. 对已经运行结束的线程调用join()方法会立刻返回。
	

*/




















